package com.xj.algorithm.leetcode;

/**
 * 整数反转
 */
public class L7_整数反转 {

    /**
     * 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
     *
     * 示例 1:
     * 输入: 123
     * 输出: 321
     *
     *  示例 2:
     * 输入: -123
     * 输出: -321
     *
     * 示例 3:
     * 输入: 120
     * 输出: 21
     *
     * 注意:
     * 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−2^31,  2^31 − 1]。请根据这个假设，如果反转后整数溢出那么就返回 0。
     */

    public static void main(String[] args) {
        System.out.println(reverseOffice(123));
        System.out.println(reverseOffice(-123));
        System.out.println(reverseOffice(120));
        System.out.println(reverseOffice(1534236469));
        System.out.println(reverseOffice(-2147483648));
    }

    //自己的解法：使用double进行比较
    public static int reverse(int x) {
        int result=0;
        while(x/10!=0 || x%10!=0){
            int quotient=x/10;
            int remainder=x%10;
            x=quotient;

            //如果最新的值比最大值要大,比最小值小
            if( new Double(result)*10+remainder > new Double(Integer.MAX_VALUE)  ||
                    new Double(result)*10+remainder < new Double(Integer.MIN_VALUE) ){
                result=0;
                break;
            }
            result=10*result+remainder;
        }
        return result;
    }

    //官方最优解：比较MAX/10就可以了。
    public static int reverseOffice(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }
}
